﻿using System;
using System.Linq;
using System.Web.Security;
using System.Web.UI.WebControls;
using PortalCurriculo.Domain;
using PortalCurriculo.Domain.Helpers;
using PortalCurriculo.Util.Translation;
using PortalCurriculo.WebUI.Helpers;

namespace PortalCurriculo.WebUI.Account
{
    public partial class Login : System.Web.UI.Page
    {
        const string MatchEmailPattern =
            @"^(([\w-]+\.)+[\w-]+|([a-zA-Z]{1}|[\w-]{2,}))@"
             + @"((([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?
				        [0-9]{1,2}|25[0-5]|2[0-4][0-9])\."
             + @"([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?
				        [0-9]{1,2}|25[0-5]|2[0-4][0-9])){1}|"
             + @"([a-zA-Z]+[\w-]+\.)+[a-zA-Z]{2,4})$";

        public IFormsAuthentication FormsAuth { get; private set; }

        protected void Page_Load(object sender, EventArgs e)
        {
            RegisterHyperLink.NavigateUrl = "Usuarios/Cadastro.aspx";
            var userName = (TextBox)LoginUser.FindControl("UserName");
            userName.Focus();
        }

        private bool ValidateLogOn(string email, string password)
        {
            if (String.IsNullOrEmpty(email))
            {
                LoginUser.FailureText = Translator.TranslateMessage(Messages.EmailInvalido, AppRelativeVirtualPath);
                return false;
            }
            if (String.IsNullOrEmpty(password))
            {
                LoginUser.FailureText = Translator.TranslateMessage(Messages.SenhaInvalida, AppRelativeVirtualPath); ;
                return false;
            }
            if (!System.Text.RegularExpressions.Regex.IsMatch(email, MatchEmailPattern))
            {
                LoginUser.FailureText = Translator.TranslateMessage(Messages.EmailInvalido, AppRelativeVirtualPath); ;
                return false;
            }

            return true;
        }

        protected void LoginButton_Click(object sender, EventArgs e)
        {
            try
            {
                string email = LoginUser.UserName;
                string senha = LoginUser.Password;

                if (!ValidateLogOn(email, senha)) return;

                AutenticarUsuario(email, senha);
            }
            catch (Exception exception)
            {
                LoginUser.FailureText = exception.Message;
            }
        }

        private void AutenticarUsuario(string email, string senha)
        {
            SessionHelper.ClearAllSessions();

            var usuarioLogin = new Usuario
                              {
                                  Senha = senha,
                                  Pessoa = new Pessoa { Email = email }
                              };

            var usuario = usuarioLogin.Autenticar();

            if (usuario == null)
            {
                var selecionadorEmpresas = new SelecionadorEmpresa().AutenticarSelecionador(usuarioLogin);

                if (selecionadorEmpresas.Count > 0)
                {
                    usuario = selecionadorEmpresas.First().Selecionador.Usuario;

                    SessionHelper.Session(SessionHelper.SessionName.SelecionadorLogado, selecionadorEmpresas.First().Selecionador);

                    var empresas = selecionadorEmpresas.Select(selecionadorEmpresa => selecionadorEmpresa.Empresa1).ToList();

                    SessionHelper.Session(SessionHelper.SessionName.EmpresasSelecionadorLogado, empresas);
                }
            }

            if (usuario == null)
            {
                LoginUser.FailureText = "Email não cadastrado.";
            }
            else
            {
                if (usuario.SenhaInvalida)
                {
                    LoginUser.FailureText = "Senha inválida.";
                    return;
                }

                if (usuario.LoginAtivo == false)
                {
                    LoginUser.FailureText = "Este usuário ainda não foi ativado, para ativá-lo clique no link recebido em seu email no cadastramento "
                        + "ou clique aqui para receber novamente o email";
                    return;
                }

                PreencherSessoes(usuario);

                string nome = usuario.Pessoa.PessoaFisica != null
                                  ? usuario.Pessoa.PessoaFisica.NomeCompleto
                                  : usuario.Pessoa.PessoaJuridica.NomeFantasia;

                FormsAuthentication.SetAuthCookie(nome.Split(' ').First(), false);

                var returnUrl = Request.QueryString.Get("returnurl");

                Response.Redirect(returnUrl ?? "../Default.aspx");
            }
        }

        private void PreencherSessoes(Usuario usuario)
        {
            if (usuario.Pessoa.PessoaFisica != null)
            {
                if (SessionHelper.Session(SessionHelper.SessionName.SelecionadorLogado) == null)
                {
                    SessionHelper.Session(SessionHelper.SessionName.AdministradorLogado,
                                          new Administrador { IdUsuario = usuario.Id }.Selecionar());
                    SessionHelper.Session(SessionHelper.SessionName.ProfissionalLogado,
                                          new Profissional { IdUsuario = usuario.Id }.Selecionar());
                    SessionHelper.Session(SessionHelper.SessionName.RedatorLogado,
                                          new Redator { IdUsuario = usuario.Id }.Selecionar());
                }
            }
            else
            {
                SessionHelper.Session(SessionHelper.SessionName.EmpresaLogada,
                                      new Empresa { IdUsuario = usuario.Id }.Selecionar());
            }

            SessionHelper.Session(SessionHelper.SessionName.ParceiroLogado,
                                  new Parceiro { IdUsuario = usuario.Id }.Selecionar());
            SessionHelper.Session(SessionHelper.SessionName.UsuarioLogado, usuario);
        }
    }
}